<?php

/**
 * 
 * class to shorten incremental integer into short word or vice versa
 * 
 *
 */

class shorten {
	
	/**
	 * 
	 * @param mixed		$in
	 * @param boolean	$toNum
	 * @param boolean	$padUp
	 * @param mixed		$passKey
	 * 
	 * @return mixed
	 */
	
	public function run($in, $toNum = false, $padUp = false, $passKey = null) {
		
  		$index = "bcdfghjklmnpqrstvwxyz0123456789BCDFGHJKLMNPQRSTVWXYZ";
  		
  		if ($passKey !== null) {
			for($n = 0; $n < strlen ( $index ); $n ++) {
				$i [] = substr ( $index, $n, 1 );
			}
			
			$passhash = hash ( 'sha256', $passKey );
			$passhash = (strlen ( $passhash ) < strlen ( $index )) ? hash ( 'sha512', $passKey ) : $passhash;
			
			for($n = 0; $n < strlen ( $index ); $n ++) {
				$p [] = substr ( $passhash, $n, 1 );
			}
			
			array_multisort ( $p, SORT_DESC, $i );
			$index = implode ( $i );
		}
 
		$base = strlen ( $index );
		
		if ($toNum) {
			// Digital number  <<--  alphabet letter code
			$in = strrev ( $in );
			$out = 0;
			$len = strlen ( $in ) - 1;
			for($t = 0; $t <= $len; $t ++) {
				$bcpow = bcpow ( $base, $len - $t );
				$out = $out + strpos ( $index, substr ( $in, $t, 1 ) ) * $bcpow;
			}
			
			if (is_numeric ( $padUp )) {
				$padUp --;
				if ($padUp > 0) {
					$out -= pow ( $base, $padUp );
				}
			}
			$out = sprintf ( '%F', $out );
			$out = substr ( $out, 0, strpos ( $out, '.' ) );
		} else {
			// Digital number  -->>  alphabet letter code
			if (is_numeric ( $padUp )) {
				$padUp --;
				if ($padUp > 0) {
					$in += pow ( $base, $padUp );
				}
			}
			
			$out = "";
			for($t = floor ( log ( $in, $base ) ); $t >= 0; $t --) {
				$bcp = bcpow ( $base, $t );
				$a = floor ( $in / $bcp ) % $base;
				$out = $out . substr ( $index, $a, 1 );
				$in = $in - ($a * $bcp);
			}
			$out = strrev ( $out ); // reverse
		}
		
		return $out;
	
	}
	
}